﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LASMobile.Classes;
using LASMobile.LASDBClasses;

namespace LASMobile
{
    public partial class Pedidos : System.Web.UI.Page
    {
        private readonly LASDBDataContext _db = new LASDBDataContext();
        private int _companyId;
        private Usuario _usuario;
        private List<Bodega> _bodegas = new List<Bodega>();
        private List<Articulo> _articulos = new List<Articulo>();
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session[Constants.SESSION_USER] != null)
            {
                _usuario = (Usuario)Session[Constants.SESSION_USER];
                _companyId = _usuario.Empresa.IdEmpresa;
            }
            else
            {
                Response.Redirect("Default.aspx", true);
            }

            if (Session[Constants.SESSION_SALE] == null)
            {
                Response.Redirect("PedidosDocumento.aspx", true);
            }
            _bodegas = GetStorageRoomsFromCompany(_companyId).ToList();
            _articulos = GetProductsFromCompany(_companyId).ToList();

            if(!IsPostBack)
            {
                BodegaDropDownList.DataSource = _bodegas.Select(bodega => bodega.NombreBodega);
                ArticuloDropDownList.DataSource = _articulos.Select(articulo => articulo.CodigoUnico);
                BodegaDropDownList.DataBind();
                ArticuloDropDownList.DataBind();
                var product = _articulos[ArticuloDropDownList.SelectedIndex];
                DetalleTextBox.Text = product.Descripcion;
            }
        }

        protected void AgregarArticulo(object sender, EventArgs e)
        {
            try
            {
                var nuevoArticulo = new PedidosDocumento.StructProducto();
                var documento = (PedidosDocumento.StructDocumento)Session[Constants.SESSION_SALE];

                nuevoArticulo.Artículo = _articulos[ArticuloDropDownList.SelectedIndex];
                nuevoArticulo.Bodega = _bodegas[BodegaDropDownList.SelectedIndex];
                nuevoArticulo.Impuesto = int.Parse(ImpuestoTextBox.Text);
                nuevoArticulo.Cantidad = int.Parse(CantidadTextBox.Text);
                nuevoArticulo.Precio = Decimal.Parse(PrecioTextBox.Text);


                if (documento.ListaDeProductos == null)
                {
                    documento.ListaDeProductos = new List<PedidosDocumento.StructProducto>();
                }

                documento.ListaDeProductos.Add(nuevoArticulo);
                Session[Constants.SESSION_SALE] = documento;
                Response.Redirect("PedidosDocumento.aspx", true); 
            }
            catch
            {
                
            }
        }

        protected void Regresar(object sender, EventArgs e)
        {
            Response.Redirect("PedidosDocumento.aspx", true);
        }

        protected void CloseSession(object sender, EventArgs e)
        {
            Session[Constants.SESSION_USER] = null;
            Session[Constants.SESSION_SALE] = null;
            Response.Redirect("Default.aspx", true);
        }

        protected void ProductChanged(object sender, EventArgs e)
        {
            if(ArticuloDropDownList.SelectedIndex>-1&&BodegaDropDownList.SelectedIndex>-1)
            {
                var product = _articulos[ArticuloDropDownList.SelectedIndex];
                DetalleTextBox.Text = product.Descripcion;

                var bodega = _bodegas[BodegaDropDownList.SelectedIndex];

                var articuloPorBodega = GetStorageRoomProduct(bodega.IdBodega, product.IdArticulo);

                PrecioTextBox.Text = articuloPorBodega.CostoUnitario.ToString();
            }
        }

        #region Métodos LINQ-TO-SQL
        /// <summary>
        /// Metodo que permite obtener la lista de bodegas
        /// </summary>
        /// <param name="companyId"></param>
        /// <returns></returns>
        private List<Bodega> GetStorageRoomsFromCompany(int companyId)
        {
            List<Bodega> listaBodegas = null;

            try
            {
                var resultado = from bodega in _db.Bodegas
                                where bodega.IdEmpresa == companyId
                                select bodega;
                listaBodegas = resultado.ToList();
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return listaBodegas;
        }



        private IEnumerable<Articulo> GetProductsFromCompany(int companyId)
        {
            List<Articulo> listaDeArticulos = null;

            try
            {
                var resultado = from articulo in _db.Articulos
                                join articulosEnBodegas in _db.Bodegas_has_Articulos on articulo.IdArticulo equals
                                    articulosEnBodegas.IdArticulo
                                join bodega in _db.Bodegas on articulosEnBodegas.IdBodega equals bodega.IdBodega
                                join empresaActual in _db.Empresas on bodega.IdBodega equals empresaActual.IdEmpresa
                                where empresaActual.IdEmpresa == companyId
                                select articulo;
                listaDeArticulos = resultado.ToList();
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }
            return listaDeArticulos;
        }

        /// <summary>
        /// Método que regresa un atículo por bodega a partir del id de la bodega y el id del producto
        /// </summary>
        /// <param name="storageRoomId"></param>
        /// <param name="productId"></param>
        /// <returns></returns>
        private Bodegas_has_Articulo GetStorageRoomProduct(int storageRoomId, int productId)
        {
            Bodegas_has_Articulo articuloEnBodegaFinal = null;

            try
            {
                var resultado = (from articuloEnBodega in _db.Bodegas_has_Articulos
                                 where articuloEnBodega.IdBodega == storageRoomId & articuloEnBodega.IdArticulo == productId
                                 select articuloEnBodega).Single();
                articuloEnBodegaFinal = resultado;
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return articuloEnBodegaFinal;
        }


        #endregion

        
    }
}